package SingleMode;

import java.lang.reflect.Constructor;

/**
 * @author 23737
 * @time 2021.9.9
 * 这里用反射来破坏单例
 */
public class Test {
    public static void main(String[] args) throws Exception {
        LazyMan instance = LazyMan.getInstance();

        //直接用java反射获得其构造器，无视其构造器的私有
        Constructor<LazyMan> declaredConstructor = LazyMan.class.getDeclaredConstructor(null);
        declaredConstructor.setAccessible(true);
        LazyMan lazyMan = declaredConstructor.newInstance();
        System.out.println(instance);
        System.out.println(lazyMan);
        /*运行发现是两个对象的hashcode是不一样的，所以可以证明反射可以破坏单例
        ------> 解决办法：在LazyMan的构造方法中加锁，这样在第二次进行new的时候就会跑出一个异常
        private LazyMan(){
            synchronized (LazyMan.class){
                throw new RuntimeException("不要试图使用反射破坏异常");
            }
        }
        */

        /*
        或者第二种办法就是使用枚举来实现单例，反射一般不能破坏枚举！
        public enum EnumSingle {
                INSTANCE;
                public EnumSingle getInstance(){
                return INSTANCE;
            }
        }
         */
    }
}
